import { NextFunction, Request, Response } from 'express'
import { AppError } from '../utils/AppError'
import { logger } from '../utils/logger'

export const errorHandler = (
  err: Error | AppError,
  req: Request,
  res: Response,
  _next: NextFunction // 使用下划线前缀表示故意未使用
) => {
  logger.error('错误详情:', {
    message: err.message,
    stack: err.stack,
    path: req.path,
    method: req.method,
    ip: req.ip,
    timestamp: new Date().toLocaleString('zh-CN'),
  })

  // 自定义错误
  if (err instanceof AppError) {
    return res.status(err.statusCode).json({
      code: err.statusCode,
      message: err.message,
      data: null,
    })
  }

  // MongoDB错误
  if (err.name === 'ValidationError') {
    return res.status(400).json({
      code: 400,
      message: '数据验证失败',
      data: null,
    })
  }

  if (err.name === 'CastError') {
    return res.status(400).json({
      code: 400,
      message: '无效的ID格式',
      data: null,
    })
  }

  // JWT错误
  if (err.name === 'JsonWebTokenError') {
    return res.status(401).json({
      code: 401,
      message: '无效的Token',
      data: null,
    })
  }

  if (err.name === 'TokenExpiredError') {
    return res.status(401).json({
      code: 401,
      message: 'Token已过期',
      data: null,
    })
  }

  // 默认错误
  return res.status(500).json({
    code: 500,
    message: process.env.NODE_ENV === 'production' ? '服务器内部错误' : err.message,
    data: null,
  })
}
